package com.example.keshe.Dao;

import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * 接口定义了销售数据访问对象（Data Access Object）的操作。
 *
 * @param <T> 销售项的类型
 */
public interface SaleDao<T> {

    /**
     * 根据分页信息获取销售项列表。
     *
     * @param pageIndex 页索引，从0开始
     * @param pageSize  每页的记录数
     * @return 销售项列表
     * @throws Exception 如果获取销售项列表时发生异常
     */
    List<T> selectByPage(int pageIndex, int pageSize) throws Exception;

    /**
     * 获取销售中的总记录数。
     *
     * @return 销售中的总记录数
     * @throws Exception 如果获取总记录数时发生异常
     */
    int getTotalRecords() throws Exception;

    /**
     * 异步添加销售项。
     *
     * @param sale 要添加的销售项
     * @return 表示异步操作完成的 {@code CompletableFuture}
     */
    CompletableFuture<Void> addSaleAsync(T sale);

    /**
     * 异步删除销售项。
     *
     * @param sale 要删除的销售项
     * @return 表示异步操作完成的 {@code CompletableFuture}
     */
    CompletableFuture<Void> deleteSaleAsync(T sale);

    /**
     * 计算在给定时间范围内特定销售项的总金额。
     *
     * @param clothingId 特定销售项的ID
     * @param startTime  计算开始时间
     * @param endTime    计算结束时间
     * @return 表示计算金额的 {@code CompletableFuture}
     */
    CompletableFuture<String> calculateMoney(String clothingId, String startTime, String endTime);

    /**
     * 计算在给定时间范围内所有销售项的总金额。
     *
     * @param startTime 计算开始时间
     * @param endTime   计算结束时间
     * @return 表示计算金额的 {@code CompletableFuture}
     */
    CompletableFuture<String> calculateAllMoney(String startTime, String endTime);
}
